//
//  State.h
//  derleyici
//
//  Created by Avea on 12/17/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#include <iostream>
#include <string>
#include <vector>
#include "Item.h"
#include <map>
#include "Nonterminal.h"

#ifndef derleyici_State_h
#define derleyici_State_h

using namespace std;

class State{
public:
    State(int);
    int getIdentifier();
    void addItemToItems(Item*);
    void addGoTo(Symbol*,State*);
    void findAllItems(); // Mümkün olan tüm parçalar yaratılır.
    bool findItemsForGivenItem(Item*); //Verilen parçanın mümkün olan itemlerini bulur listeye ekler
    void findPossibleGoTos(); //Durumun mümkün olan tüm geçişlerini hesaplar ve map'a ekler
    bool isItemOnTheList(Item *); //Parametre olarak verilen parçanın listede olup olmadığını kontrol eder
    bool isSymbolOnTheMapThenAddItemToState(Symbol *, Item*); //Parametre olarak verilen sembolün daha önce geçiş listesinde olup olmadığını kontrol eder
    void printItems();
    void printGoToMap();
    bool isAllItemFounded();
    vector<Item *> getItems();
    State* getMapStateBySymbol(Symbol *);
    bool isSymbolOnTheMap(Symbol *);
    bool isSymbolReducible(Symbol *); //Sembolü, parçaların sonraki sözcüklerinde arar varsa indirgenebilir..
    Rule* getReductionBySymbol(Symbol *);
private:
    vector<Item *> items;
    int identifier;
    multimap<Symbol*,State*> goToMap;
    bool allItemFounded;
};


#endif
